#include <iostream>
#include <unistd.h>
#include <cstring>
#include <cerrno>
#include <ctime>
#include <sys/time.h>
#include <fcntl.h>
#include <cassert>

// 将指定的文 件描述符或套接字设置为非阻塞
bool SetNonBlock(int fd)
{
    int fl = fcntl(fd, F_GETFL); // 在底层获取当前fd对应的文件读写标志位
    if (fl < 0)
    {
        return false; // 读取失败
    }
    fcntl(fd, F_SETFL, fl | O_NONBLOCK); // 设置非阻塞
    return true;
}

int main()
{
    while (true)
    {
        std::cout << "time: " << (unsigned long)time(nullptr) << std::endl;
        struct timeval currtime = {0, 0};
        int n = gettimeofday(&currtime, nullptr);
        assert(n == 0);
        (void)n;
        std::cout<< "gettimrofday: " <<currtime.tv_sec<<"."<<currtime.tv_usec<<std::endl;
        sleep(1);
    }

    // SetNonBlock(0);  // 把0号描述符设置为非阻塞，只要设置一次，后续就是非阻塞了
    // char buffer[1024];
    // while(true)
    // {
    //     sleep(1);
    //     errno=0;  //初始的时候设置为0，不然读取成功的化errno不会被改变还是显示11
    //     // 非阻塞的时候，我们时以出错的形式返回，告知上层没有就绪
    //     //数据就绪了就读取
    //     ssize_t s=read(0, buffer, sizeof(buffer)-1);
    //     // 读取出错errno也会被设置，表面出错的原因
    //     if(s>0)
    //     {
    //         buffer[s-1]=0;
    //         std::cout<<"echo #"<<buffer<<" errno: "<<errno<<"errstring: "<<strerror(errno)<<std::endl;
    //     }
    //     else
    //     {
    //         //errno=11 只代表底层数据没有错，只是没有就绪
    //         // std::cout<<"read \"error\" "<<" errno: "<<errno<<"errstring: "<<strerror(errno)<<std::endl;

    //         if(errno == EWOULDBLOCK || errno == EAGAIN)
    //         {
    //             std::cout<<"当前0号fd数据没有就绪，请下一次再来试试把"<<std::endl;
    //             continue;
    //         }
    //         else if(errno == EINTR)
    //         {
    //             std::cout<<"当前IO可能被信号中断，再试一试"<<std::endl;
    //             continue;
    //         }
    //         else
    //         {
    //             // 进行差错处理

    //         }

    //     }
    // }

    return 0;
}